// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International // https://creativecommons.org/licenses/by-nc-sa/4.0/ // © BigBeluga //@version=6 indicator("Chỉ báo lọc nhiễu Kháng cự Hỗ trợ", overlay = true, max_lines_count = 500) // INPUTS ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{ display = input.bool(true, "", inline = "f") fractalLen = input.int(5, "Lọc nhiễu Đỉnh Đáy", inline = "f", minval = 2) supCount = input.int(3, "Số lần đảo chiều test tại Hỗ trợ", inline = "Sup", minval = 2) colorSup = input.color(color.lime, "", inline = "Sup") resCount = input.int(3, "Số lần đảo chiều test tại Kháng cự", inline = "Res", minval = 2) colorRes = input.color(color.orange, "", inline = "Res") typeZone = input.string("average", "Cách tính biên của Kháng Cự & Hỗ trợ", ["average", "max/min"], tooltip = "Average là trung bình giá của vùng đó, Max/min là lấy high low làm biên ") == "average" RightRange = fractalLen LeftRange = fractalLen var FracrtalUp = array.new(100, 0) var FracrtalLow = array.new(100, 0) // } // CALCULATIONS――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{ bool upperF = high[RightRange] >= ta.highest(high,LeftRange+RightRange+1) bool lowerF = low[RightRange] <= ta.lowest(low,LeftRange+RightRange+1) if upperF FracrtalUp.push(high[RightRange]) if lowerF FracrtalLow.push(low[RightRange]) method drawFractalLevel(array Fracrtal, countAmount, side = true)=> atr = ta.atr(200) color = side ? colorSup : colorRes var startIndex = bar_index int count = 0 var level = line(na) var zone = box(na) if Fracrtal.size() > countAmount Fracrtal.shift() if Fracrtal.size() >= countAmount and bar_index - startIndex > 100 lastF = Fracrtal.last() upper = lastF + atr lower = lastF - atr for i = 0 to -countAmount if Fracrtal.get(i) > lower and Fracrtal.get(i) < upper count += 1 if count == countAmount fractalLevel = typeZone ? Fracrtal.avg() : (side ? Fracrtal.min() : Fracrtal.max()) level := line.new(bar_index - 50, fractalLevel, bar_index+20, fractalLevel, color = color) zone := box.new(bar_index-50, fractalLevel, bar_index+10, fractalLevel-(side ? atr : -atr) , bgcolor = color.new(color, 80) , border_color = color(na) , text = str.tostring(countAmount) , text_color = chart.fg_color) startIndex := bar_index level.set_x2(bar_index+20) zone.set_right(bar_index+10) // } // PLOT ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{ FracrtalUp.drawFractalLevel(resCount, side = false) FracrtalLow.drawFractalLevel(supCount, side = true) plotshape(upperF, "", location = location.abovebar, size = size.tiny, color = color.new(colorRes, 50), style = shape.triangledown, offset = -5, display = display ? display.all : display.none) plotshape(lowerF, "", location = location.belowbar, size = size.tiny, color = color.new(colorSup, 50), style = shape.triangleup, offset = -5, display = display ? display.all : display.none) // }